/***********************************************************************
 * @file kcore_CS.cpp
 * Date         Author      description
 * ==========   =========   =======================================
 * 2023-07-14   Teng Long   xx
 *
 * @Copyright (C)  2023 
***********************************************************************/
/* Files includes  -----------------------------------------------------------*/
#include "kcore_CS.h"

/* Variables -----------------------------------------------------------------*/


/* Functions ----------------------------------------------------------------*/
// int bin[edge_num], vert[edge_num], pos[edge_num];
// int cnt = 0;


// void k_core_decomposition(){
//     int max_degree = 0;
//     for(int i = 1; i <= node_num; i++) {
//         max_degree = max(max_degree, deg[i]);
//     }
//     for(int i = 0; i <= max_degree; i++) {
//         bin[i] = 0;
//     }
//     for(int i = 1; i <= node_num; i++){
//         bin[deg[i]]++;
//     }
//     int start = 1;
//     for(int i = 0; i <= max_degree; i++){
//         int num = bin[i];
//         bin[i] = start;//度0的第一个索引位置1， bin[1] = 4,度1的第一个索引位置为4.
//         start += num;
//     }
//     for(int i = 1; i <= node_num; i++){
//         pos[i] = bin[deg[i]];//得到每个节点的bin[du] 即对应度的第一个索引位置。
//         vert[pos[i]] = i;
//         bin[deg[i]]++;
//     }
//     for(int i = max_degree; i >= 1; i--) {
//         bin[i] = bin[i-1];//给它变回去
//     }
//     bin[0] = 1;
//     for(int i = 1; i <= node_num; i++){
//         int u = vert[i];// pos 相当于是每个节点的座位号 节点越小度越小的话他的pos值就是[1,1+deg[0]], 这里的pos的 key就是结点i按度和
//         //编号递增来排序后的位置，比如pos[1] = 1代表1结点sort后排第一，pos[2] = 2，2结点排第2，pos[3] = 10, 3结点排第10。
//         //vert[i] 就是第i个位置的结点编号。这里的过程其实就相当与把度从小到大排好序了，桶排序。
//         for (int k = head_outNeighbor[u]; ~k; k = edge_outNeighbor[k].next){
//             int v = edge_outNeighbor[k].to;
//             if(deg[v] > deg[u]){
//                 int dv = deg[v], pv = pos[v];
//                 int pw = bin[dv], w = vert[pw];
//                 if(v != w){
//                     pos[v] = pw; vert[pv] = w;//
//                     pos[w] = pv; vert[pw] = v;
//                 }
//                 bin[dv]++;
//                 deg[v]--;
//             }
//         }
//     }
//     for(int i = 1; i <= node_num; i++) printf("%d\n",deg[i]);
//     //例如，3-core，就是deg[i] >= 3的集合。
//     return;
// }